﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Data;

namespace FancyIdea.PingShui.Core.Dal
{
    public class 评税信息操作
    {
        /**
         * 添加电子评税信息
         * */
        public static bool AddAssessment(评税信息 ass)
        {
            string sql = @"insert into 评税信息表 (操作时间,纳税人代码,
自报营业额,设备数量,设备定额,每月平均采购成本,经营面积,单位面积租金,单位面积装修折旧费,水费,
电费,燃气费,物业管理费,其他费用,经营系数,电子评税额,执行定额,评税状态,定额执行日期,定额截止日期) values (:操作时间,'" + ass.纳税人代码 + "'," + ass.自报营业额 + "," + ass.设备数量
+ "," + ass.设备定额 + "," + ass.每月平均采购成本 + "," + ass.经营面积 + "," + ass.单位面积租金
+ "," + ass.单位面积装修折旧费 + "," + ass.水费 + "," + ass.电费 + "," + ass.燃气费
+ "," + ass.物业管理费 + "," + ass.其他费用 + "," + ass.经营系数 + "," + ass.电子评税额 + "," + ass.执行定额 + "," + ass.评税状态
+ ",:定额执行日期,:定额截止日期)";
            using (OracleCmd cmd = new OracleCmd())
            {
                cmd.SetCommand(sql);
                try
                {
                    cmd.AddParameter("操作时间", ass.操作时间);
                    cmd.AddParameter("定额执行日期", ass.定额执行日期);
                    cmd.AddParameter("定额截止日期", ass.定额截止日期);
                    return cmd.ExecuteNonQuery() > 0;
                }
                catch
                {
                    return false;
                }
            }
        }

        /* 修改电子评税信息*/
        public static bool UpdateAssessment(评税信息 ass)
        {
            string sql = @"update 评税信息表 set 自报营业额=" + ass.自报营业额 + ",设备数量=" + ass.设备数量 + ",设备定额=" + ass.设备定额
+ ",每月平均采购成本=" + ass.每月平均采购成本 + ",经营面积=" + ass.经营面积 + ",单位面积租金=" + ass.单位面积租金
+ ",单位面积装修折旧费=" + ass.单位面积装修折旧费 + ",水费=" + ass.水费
+ ",电费=" + ass.电费 + ",燃气费=" + ass.燃气费 + ",物业管理费=" + ass.物业管理费 + ",其他费用=" + ass.其他费用
+ ",经营系数=" + ass.经营系数 + ",电子评税额=" + ass.电子评税额 + ",执行定额=" + ass.执行定额
+ ",评税状态=" + ass.评税状态 + ",定额执行日期='" + ass.定额执行日期 + "',定额截止日期='" + ass.定额截止日期 + "' where 纳税人代码='" + ass.纳税人代码 + "'";
            return CmdUtil.ExcuteNonQuery(sql);
        }

        /*得到电子评税详细信息*/
        public static 评税信息 GetAssessment(string 纳税人代码)
        {
            string sql = @"select * from 评税信息表 where 纳税人代码='" + 纳税人代码 + "' order by 操作时间 desc";
            DataRow row = CmdUtil.ExcuteDataRow(sql);
            评税信息 ass = new 评税信息();
            if (row != null)
            {
                try
                {
                    ass.操作时间 = DateTime.Parse(row["操作时间"].ToString());
                    ass.单位面积装修折旧费 = float.Parse(row["单位面积装修折旧费"].ToString());
                    ass.单位面积租金 = float.Parse(row["单位面积租金"].ToString());
                    ass.电费 = float.Parse(row["电费"].ToString());
                    ass.电子评税额 = float.Parse(row["电子评税额"].ToString());
                    ass.经营面积 = float.Parse(row["经营面积"].ToString());
                    ass.经营系数 = float.Parse(row["经营系数"].ToString());
                    ass.每月平均采购成本 = float.Parse(row["每月平均采购成本"].ToString());
                    ass.纳税人代码 = row["纳税人代码"].ToString();
                    ass.其他费用 = float.Parse(row["其他费用"].ToString());
                    ass.燃气费 = float.Parse(row["燃气费"].ToString());
                    ass.设备定额 = float.Parse(row["设备定额"].ToString());
                    ass.设备数量 = int.Parse(row["设备数量"].ToString());
                    ass.水费 = float.Parse(row["水费"].ToString());
                    ass.物业管理费 = float.Parse(row["物业管理费"].ToString());
                    ass.执行定额 = float.Parse(row["执行定额"].ToString());
                    ass.自报营业额 = float.Parse(row["自报营业额"].ToString());
                    ass.定额执行日期 = DateTime.Parse(row["定额执行日期"].ToString());
                    ass.定额截止日期 = DateTime.Parse(row["定额截止日期"].ToString());
                }
                catch
                {
                    return null;
                }
            }
            return ass;
        }

        /*得到电子评税详细信息*/
        public static DataRow GetAssessmentRow(string 纳税人代码)
        {
            string sql = @"select * from 评税信息表 where 纳税人代码='" + 纳税人代码 + "'";
            return CmdUtil.ExcuteDataRow(sql);
        }

        public static DataRow GetAssessmentRow(string 纳税人代码, DateTime 操作时间)
        {
            string sql = @"select * from 评税信息表 where 纳税人代码='" + 纳税人代码 + "' and 操作时间=:操作时间";
            using (OracleCmd cmd = new OracleCmd())
            {
                cmd.SetCommand(sql).AddParameter("操作时间", 操作时间);
                return cmd.ExecuteDataRow();
            }
        }

        public static bool CheckAssessment(string 纳税人代码)
        {
            string sql = @"select * from 评税信息表 where 纳税人代码='" + 纳税人代码 + "'";
            try
            {
                return CmdUtil.ExcuteDataTable(sql).Rows.Count > 0;
            }
            catch
            {
                return false;
            }
        }

        public static bool DeleteAssessment(string 纳税人代码)
        {
            string sql = @"delete from 评税信息表 where 纳税人代码='" + 纳税人代码 + "'";
            return CmdUtil.ExcuteNonQuery(sql);
        }

        public static bool DeleteAssessment(string[] 纳税人代码)
        {
            return CmdUtil.DeleteMuti("评税信息表", "纳税人代码", 纳税人代码);
        }

        public static bool AddOperator(string 纳税人代码, string[] operators)
        {
            if (operators == null || operators.Length < 1)
            {
                return false;
            }
            string sql = "";
            using (OracleCmd cmd = new OracleCmd())
            {
                cmd.BeginTransaction();
                sql = @"delete from 评税操作员表 where 纳税人代码='" + 纳税人代码 + "'";
                cmd.SetCommand(sql);
                if (cmd.ExecuteNonQuery() <= 0)
                {
                    cmd.RollbackTransaction();
                    return false;
                }
                cmd.ClearParameters();
                for (int i = 0; i < operators.Length; i++)
                {
                    sql = @"insert into 评税操作员表 (纳税人代码,操作员代码) values ('" + 纳税人代码 +
                        "','" + operators[i] + "')";
                    cmd.SetCommand(sql);
                    if (cmd.ExecuteNonQuery() <= 0)
                    {
                        cmd.RollbackTransaction();
                        return false;
                    }
                    cmd.ClearParameters();
                }
                cmd.CommitTransaction();
                return true;
            }
        }

        public static bool AddOperator(string 纳税人代码, string[] operators, DateTime 操作时间)
        {
            if (operators == null || operators.Length < 1)
            {
                return false;
            }
            string sql = "";
            using (OracleCmd cmd = new OracleCmd())
            {
                cmd.BeginTransaction();
                for (int i = 0; i < operators.Length; i++)
                {
                    sql = @"insert into 评税操作员表 (纳税人代码,操作员代码,操作时间) values ('" + 纳税人代码 +
                        "','" + operators[i] + "',:操作时间)";
                    cmd.SetCommand(sql);
                    cmd.AddParameter("操作时间", 操作时间);
                    if (cmd.ExecuteNonQuery() <= 0)
                    {
                        cmd.RollbackTransaction();
                        return false;
                    }
                    cmd.ClearParameters();
                }
                cmd.CommitTransaction();
                return true;
            }
        }

        public static bool DeleteOperator(string 纳税人代码)
        {
            string sql = @"delete from 评税操作员表 where 纳税人代码='" + 纳税人代码 + "'";
            return CmdUtil.ExcuteNonQuery(sql);
        }

        public static DataTable GetEmployees(string 纳税人代码, DateTime 操作时间)
        {
            string sql = @"select a.职业名称,a.职业代码,b.从业人员人数,b.从业人员平均工资 from 评税从业人员表 b 
left join 职业表 a on a.职业代码= b.从业人员代码 
left join 评税信息表 c on c.纳税人代码=b.纳税人代码 and c.操作时间=b.操作时间 
where c.纳税人代码='" + 纳税人代码 + "'";
            DataTable table = null;
            if (操作时间 != DateTime.MinValue)
            {
                sql += " and c.操作时间=:操作时间";
                using (OracleCmd cmd = new OracleCmd())
                {
                    cmd.SetCommand(sql).AddParameter("操作时间", 操作时间);
                    table = cmd.ExecuteDataTable();
                }
            }
            else
            {
                sql = @"select a.职业名称,a.职业代码,0 as 从业人员人数,0 as 从业人员平均工资 from 职业表 a 
left join 基本信息表 b on b.行业细目代码=a.行业细目代码 and b.税务机关代码=a.税务机关代码
where b.纳税人代码='" + 纳税人代码 + "'";
                table = CmdUtil.ExcuteDataTable(sql);
            }
            if (table == null || table.Rows.Count < 1)
            {
                sql = @"select a.职业名称,a.职业代码,0 as 从业人员人数,0 as 从业人员平均工资 from 职业表 a 
left join 基本信息表 b on b.行业细目代码=a.行业细目代码 and b.税务机关代码=a.税务机关代码
where b.纳税人代码='" + 纳税人代码 + "'";
                return CmdUtil.ExcuteDataTable(sql);
            }
            else
            {
                return table;
            }
        }

        public static bool AddEmployees(string 纳税人代码, string 从业人员代码, int 从业人员人数, float 从业人员平均工资)
        {
            string sql = @"insert into 评税从业人员表 (纳税人代码,从业人员代码,从业人员人数,从业人员平均工资) values ('" + 纳税人代码
                + "','" + 从业人员代码 + "'," + 从业人员人数 + "," + 从业人员平均工资 + ")";
            return CmdUtil.ExcuteNonQuery(sql);
        }

        public static bool AddEmployees(string 纳税人代码, string[] 职业代码, string[] 人数, string[] 工资)
        {
            if (职业代码 == null || 职业代码.Length < 1) return false;
            string sql = @"";
            using (OracleCmd cmd = new OracleCmd())
            {
                cmd.BeginTransaction();
                sql = @"delete from 评税从业人员表 where 纳税人代码='" + 纳税人代码 + "'";
                cmd.SetCommand(sql);
                if (cmd.ExecuteNonQuery() < 0)
                {
                    cmd.RollbackTransaction();
                    return false;
                }
                cmd.ClearParameters();
                for (int i = 0; i < 职业代码.Length; i++)
                {
                    sql = @"insert into 评税从业人员表 (纳税人代码,从业人员代码,从业人员人数,从业人员平均工资) values ('" + 纳税人代码
                + "','" + 职业代码[i] + "'," + 人数[i] + "," + 工资[i] + ")";
                    cmd.SetCommand(sql);
                    if (cmd.ExecuteNonQuery() < 1)
                    {
                        cmd.RollbackTransaction();
                        return false;
                    }
                    cmd.ClearParameters();
                }
                cmd.CommitTransaction();
                return true;
            }
        }

        public static bool AddEmployees(string 纳税人代码, string[] 职业代码, string[] 人数, string[] 工资, DateTime 操作时间)
        {
            if (职业代码 == null || 职业代码.Length < 1) return false;
            string sql = @"";
            using (OracleCmd cmd = new OracleCmd())
            {
                cmd.BeginTransaction();
                for (int i = 0; i < 职业代码.Length; i++)
                {
                    sql = @"insert into 评税从业人员表 (纳税人代码,从业人员代码,从业人员人数,从业人员平均工资,操作时间) values ('" + 纳税人代码
                + "','" + 职业代码[i] + "'," + 人数[i] + "," + 工资[i] + ",:操作时间)";
                    cmd.SetCommand(sql);
                    cmd.AddParameter("操作时间", 操作时间);
                    if (cmd.ExecuteNonQuery() < 1)
                    {
                        cmd.RollbackTransaction();
                        return false;
                    }
                    cmd.ClearParameters();
                }
                cmd.CommitTransaction();
                return true;
            }
        }

        public static bool DeleteEmployees(string 纳税人代码)
        {
            string sql = @"delete from 评税从业人员表 where 纳税人代码='" + 纳税人代码 + "'";
            return CmdUtil.ExcuteNonQuery(sql);
        }

        public static DataTable GetAlarmInfo(string 纳税人代码)
        {
            string sql = @"select a.单位面积装修折旧费参考,(a.单位面积装修折旧费参考*(1-a.折旧费预警幅度/100)) as 折旧费预警, 
a.单位面积电费参考,(a.单位面积电费参考*(1-a.电费预警幅度/100)) as 电费预警,
a.单位面积水费参考,(a.单位面积水费参考*(1-a.水费预警幅度/100)) as 水费预警,
a.单位面积燃气费参考,(a.单位面积燃气费参考*(1-a.燃气费预警幅度/100)) as 燃气费预警,
e.设备定额 
from 行业细目参数表 a 
left join  基本信息表 b on b.行业细目代码=a.行业细目代码
where b.纳税人代码='" + 纳税人代码 + "'";
            string sql1 = @"select a.成本利润率 from 行业表 a 
left join 基本信息表 b on b.行业代码=a.行业代码 
where b.纳税人代码='" + 纳税人代码 + "'";
            string sql2 = @"select e.征收税率 as 营业税率 from 征收品目表 e 
left join 基本信息表 b on e.征收项目代码=b.征收项目代码 and e.征收品目代码=b.征收品目代码
where b.纳税人代码='" + 纳税人代码 + "'";
            DataTable table = CmdUtil.ExcuteDataTable(sql1);
            if (table == null || table.Rows.Count < 1)
            {
                table.Columns.Add("成本利润率");
                table.Rows.Add();
                table.Rows[0][0] = "0";
            }
            DataTable table1 = CmdUtil.ExcuteDataTable(sql);
            string yysl = "0"; 
            try
            {
                yysl = CmdUtil.ExcuteScalar(sql2).ToString();
            }
            catch
            {
                //
            }
            if(table1!=null)
            {
                foreach (DataColumn col in table1.Columns)
                {
                    table.Columns.Add(col.ColumnName);
                    table.Rows[0][col.ColumnName] = table1.Rows[0][col.ColumnName];
                }
            }
            table.Columns.Add("营业税率");
            table.Rows[0]["营业税率"] = yysl;
            table.Columns.Add("单位面积租金参考");
            table.Columns.Add("租金预警幅度");
            DataRow row = GetMoney(纳税人代码);
            if (row != null && table.Rows.Count > 0)
            {
                table.Rows[0]["单位面积租金参考"] = row[0];
                table.Rows[0]["租金预警幅度"] = row[1];
            }
            return table;
        }

        public static DataTable GetAlarmInfoByHyxm(string 行业细目代码)
        {
            string sql = @"select a.单位面积装修折旧费参考,(a.单位面积装修折旧费参考*(1-a.折旧费预警幅度)) as 折旧费预警, 
a.单位面积电费参考,(a.单位面积电费参考*(1-a.电费预警幅度)) as 电费预警,
a.单位面积水费参考,(a.单位面积水费参考*(1-a.水费预警幅度)) as 水费预警,
a.单位面积燃气费参考,(a.单位面积燃气费参考*(1-a.燃气费预警幅度)) as 燃气费预警, 
d.成本利润率,e.征收税率 as 营业税率
from 行业细目参数表 a 
left join  基本信息表 b on b.行业细目代码=a.行业细目代码
left join 行业表 d on d.行业代码=a.行业代码
left join 征收品目表 e on e.征收项目代码=b.征收项目代码 and e.征收品目代码=b.征收品目代码 
where a.行业细目代码='" + 行业细目代码 + "'";
            return CmdUtil.ExcuteDataTable(sql);
        }

        public static DataRow GetMoney(string 纳税人代码)
        {
            string sql = @"select 楼层 from 基本信息表 where 纳税人代码='" + 纳税人代码 + "'";
            string louceng = "";
            try
            {
                louceng = CmdUtil.ExcuteScalar(sql).ToString();
            }
            catch
            {
                //丢失
            }
            if (string.IsNullOrEmpty(louceng))//如果没有楼层数
            {
                sql = @"select isnull((a.预警幅度/100*a.单位面积租金参考),0) from 建筑物表 a 
left join 基本信息表 b on b.税务机关代码=a.税务机关代码 and b.建筑物代码=a.建筑物代码 and b.街道代码=a.街道代码 
where b.纳税人代码='" + 纳税人代码 + "'";
                string y1 = "";
                try
                {
                    y1 = CmdUtil.ExcuteScalar(sql).ToString();
                }
                catch
                {
                    //丢失
                }
                if (string.IsNullOrEmpty(y1))//如果建筑物没有预警幅度
                {
                    sql = @"select a.单位面积租金参考,(a.单位面积租金参考-(1-a.预警幅度/100)) as 预警幅度 from 街道表 a 
left join 基本信息表 b on b.税务机关代码=a.税务机关代码 and b.街道代码=a.街道代码 
where b.纳税人代码='" + 纳税人代码 + "'";
                    return CmdUtil.ExcuteDataRow(sql);
                }
                else
                {
                    sql = @"select a.单位面积租金参考,(a.单位面积租金参考-(1-a.预警幅度/100)) as 预警幅度 from 建筑物表 a 
left join 基本信息表 b on b.税务机关代码=a.税务机关代码 and b.建筑物代码=a.建筑物代码 and b.街道代码=a.街道代码 
where b.纳税人代码='" + 纳税人代码 + "'";
                    return CmdUtil.ExcuteDataRow(sql);
                }
            }
            else
            {
                int lc = int.Parse(louceng);
                if (lc == 1)
                {
                    sql = @"select a.一层租金参考 as 单位面积租金参考,(a.一层租金参考*(1-a.预警幅度/100)) as 预警幅度 from 建筑物表 a 
left join 基本信息表 b on b.税务机关代码=a.税务机关代码 and b.建筑物代码=a.建筑物代码 and b.街道代码=a.街道代码 
where b.纳税人代码='" + 纳税人代码 + "'";
                }
                else if (lc == 2)
                {
                    sql = @"select a.二层租金参考 as 单位面积租金参考,(a.二层租金参考*(1-a.预警幅度/100)) as 预警幅度 from 建筑物表 a 
left join 基本信息表 b on b.税务机关代码=a.税务机关代码 and b.建筑物代码=a.建筑物代码 and b.街道代码=a.街道代码 
where b.纳税人代码='" + 纳税人代码 + "'";
                }
                else
                {
                    sql = @"select a.三层及以上租金参考 as 单位面积租金参考,(a.三层及以上租金参考*(1-a.预警幅度/100)) as 预警幅度 from 建筑物表 a 
left join 基本信息表 b on b.税务机关代码=a.税务机关代码 and b.建筑物代码=a.建筑物代码 and b.街道代码=a.街道代码 
where b.纳税人代码='" + 纳税人代码 + "'";
                }
                return CmdUtil.ExcuteDataRow(sql);
            }
        }

        public static DataTable GetZhiYe(string 纳税人代码)
        {
            string sql = @"select a.职业代码 as 从业人员代码,a.每月平均工资参考,(a.每月平均工资参考*(1-a.预警幅度/100)) as 工资预警 
from 职业表 a 
left join 基本信息表 b on b.行业细目代码=a.行业细目代码 
where b.纳税人代码='" + 纳税人代码 + "'";
            return CmdUtil.ExcuteDataTable(sql);
        }

        public static DataTable GetZhiYeByHyxm(string 行业细目代码)
        {
            string sql = @"select a.职业代码 as 从业人员代码,a.每月平均工资参考,(a.每月平均工资参考*(1-a.预警幅度/100)) as 工资预警 
from 职业表 a 
where a.行业细目代码='" + 行业细目代码 + "'";
            return CmdUtil.ExcuteDataTable(sql);
        }

        public static int CalcState(string 纳税人代码, float 折旧费, float 单位面积租金,
            float 水费, float 电费, float 燃气费, float 设备数量, float 设备定额)
        {
            int state = (int)评税状态.正常;
            if (折旧费 <= 0 && 单位面积租金 <= 0 && 水费 <= 0 && 电费 <= 0 &&
                燃气费 <= 0 && 设备数量 <= 0 && 设备定额 <= 0)
            {
                state = (int)评税状态.异常;
                return state;
            }
            DataTable table = GetAlarmInfo(纳税人代码);
            foreach (DataRow row in table.Rows)
            {
                if (水费 < float.Parse(row["水费预警"].ToString()))
                {
                    state = (int)评税状态.异常;
                    break;
                }
                if (电费 < float.Parse(row["电费预警"].ToString()))
                {
                    state = (int)评税状态.异常;
                    break;
                }
                if (燃气费 < float.Parse(row["燃气费预警"].ToString()))
                {
                    state = (int)评税状态.异常;
                    break;
                }
            }
            return state;
        }

        public static DataTable GetPrintData(string 纳税人代码, DateTime 操作时间)
        {
            string sql = @"select a.*,b.纳税人名称,c.征收品目名称,c.征收税率 from 评税信息表 a  
left join 基本信息表 b on b.纳税人代码 = a.纳税人代码 
left join 征收品目表 c on c.征收品目代码 = b.征收品目代码
where a.纳税人代码='" + 纳税人代码 + "'";
            if (操作时间 != DateTime.MinValue)
            {
                sql += "and a.操作时间=:操作时间";
                using (OracleCmd cmd = new OracleCmd())
                {
                    cmd.SetCommand(sql).AddParameter("操作时间", 操作时间);
                    return cmd.ExecuteDataTable();
                }
            }
            else
            {
                using (OracleCmd cmd = new OracleCmd())
                {
                    sql += " and a.操作时间=(select max(操作时间) from 评税信息表 where 纳税人代码='" + 纳税人代码 + "')";
                    return CmdUtil.ExcuteDataTable(sql);
                }
            }
        }
    }
}